Geonodes Part 3
УРОВЕНЬ 2: ПРОДВИНУТЫЕ КОНЦЕПЦИИ
Введение в Уровень 2
Цель уровня: Освоить глубокие концепции Fields и Attributes, полностью разобраться с математикой и векторами, научиться использовать текстуры для деформации, начать применять Raycast и Proximity для взаимодействия геометрий.
Требования: Уровень 1 полностью пройден, понимание базовых нод
Время обучения: 5-7 недель при регулярной практике (4-6 часов в день)
Ожидаемый результат: Вы сможете создавать сложные процедурные системы, работать с данными через атрибуты, создавать параметрические модели
МОДУЛЬ 2.1: FIELDS И ATTRIBUTES — РАСШИРЕННЫЙ МАСТЕР-КЛАСС
Концепция: Fields vs Attributes — фундаментальное различие
Attribute = Data хранимые на геометрии
Geometry содержит:
- Position (где находится каждая вершина)
- Normal (в каком направлении смотрит поверхность)
- UV (координаты текстуры)
- Vertex Color (цвет каждой вершины)
- Custom attributes (ваши собственные данные)
Field = Инструкция вычисления значения
Field = Функция которая вычисляет значение для каждого элемента в момент использования
Ключевое различие:
- Attribute = "вот это значение прямо сейчас"
- Field = "инструкция как это вычислить"
Ключевые ноды (УРОВЕНЬ 2.1)
Position Node — Получение позиции
Документация: https://docs.blender.org/manual/en/latest/modeling/geometry_nodes/geometry/read/position.html
Назначение: Получить (X, Y, Z) координаты каждой вершины/точки
Важно: Position это field, а не атрибут!
- При каждом использовании позиция переоценивается
- После деформации Position даст новые координаты
- Для сохранения ИСХОДНОЙ позиции используйте Capture Attribute
Пример:
Position node (текущие координаты)
↓
Math (Multiply по Z на 2)
↓
Set Position Offset (поднять в два раза)
Capture Attribute — Замораживание значения
Документация: https://docs.blender.org/manual/en/latest/modeling/geometry_nodes/attribute/capture_attribute.html
Назначение: "Заморозить" field в конкретный момент, преобразуя в anonymous attribute
Как это работает:
Field → Capture Attribute → сохраняется текущее значение
↓
может быть использовано где угодно
но как фиксированное значение
Ключевое отличие от Store Named Attribute:
- Capture = временный, anonymous (имени нет)
- Store Named = постоянный, имеет имя, видим в Shader Editor
Когда использовать Capture:
- Быстрые операции внутри одной цепи нод
- Когда не нужно экспортировать в материалы
- Для лучшей производительности
Пример практического использования:
ПРОБЛЕМА: Хотим сохранить ИСХОДНУЮ позицию перед деформацией
РЕШЕНИЕ:
Position → Capture Attribute (сохранили оригинальную позицию)
↓
(далее в tree...)
Noise Texture + Set Position (деформировали)
↓
Named Attribute (get captured original position) → используем для сравнения
Официальная документация: https://docs.blender.org/manual/en/latest/modeling/geometry_nodes/attribute/capture_attribute.html
Store Named Attribute — Именованное сохранение
Документация: https://docs.blender.org/manual/en/latest/modeling/geometry_nodes/attribute/store_named_attribute.html
Назначение: Сохранить данные с именем для использования везде (включая Shader Editor)
Входы:
- Geometry — исходная геометрия
- Attribute — значение/field для сохранения
- Name — как называть атрибут (строка текста)
- Domain — где хранить (Point, Edge, Face, Corner, Spline)
Выход: Геометрия с новым атрибутом (зелёный провод)
ВАЖНО: Геометрия ДОЛЖНА пройти ЧЕрез Store Named Attribute!
ПРАВИЛЬНО:
Position → Store Named Attribute → Group Output
НЕПРАВИЛЬНО:
Position → Store Named Attribute (но геометрия не проходит!)
Когда использовать Store Named:
- Нужно экспортировать в Shader Editor
- Нужно передавать между node groups
- Нужен persistent атрибут
Пример в Shader Editor:
GN создал: Store Named Attribute (name: "my_color", значение: Color)
↓
Shader Editor: Attribute Node (name: "my_color") → подключить к Principled BSDF
Named Attribute — Чтение именованного атрибута
Документация: https://docs.blender.org/manual/en/latest/modeling/geometry_nodes/attribute/named_attribute.html
Назначение: Прочитать атрибут по имени
Как работает:
Store Named Attribute (создали "custom_value")
↓
Named Attribute ("custom_value") ← читаем
↓
используем значение где угодно
Домены атрибутов (критически важно!)
| Домен | Где хранится | Пример | Когда использовать |
|---|---|---|---|
| Point | На вершинах | Position, Vertex Colors | Работа с вершинами mesh |
| Edge | На рёбрах | Edge Weight | Тонкие линии, проводка |
| Face | На лицах | Материал face | Разные материалы на грани |
| Corner | На углах граней | UV Maps | Текстурирование |
| Spline | На сплайнах кривой | Spline Width | Кривые, волосы |
ВАЖНО: Атрибут существует ТОЛЬКО в его домене!
Пример проблемы:
Store Named Attribute на Face домене
↓
Named Attribute на Face домене ✓ (работает)
↓
Distribute Points on Faces (создаёт Point домен)
↓
Named Attribute на Point домене ✗ (ОШИБКА! нет атрибута в Point домене)
Решение: Преобразовать домен ПЕРЕД использованием атрибута
Лучшие туториалы (УРОВЕНЬ 2.1)
Обязательные базовые
-
Simon Thommes - Fields Theory - Blender Studio
- Сводка: Официальный курс от разработчика Geometry Nodes! Очень подробное объяснение.
- Версия: Актуально для 3.0+
- Длительность: ~1 час
- Уровень: Средний
- ОБЯЗАТЕЛЬНО: Смотрите целиком!
-
A guide to attributes & fields - YouTube
- Сводка: Визуальное объяснение с примерами. Очень понятно.
- Длительность: ~28 минут
- Уровень: Новичок-Средний
- Изучите: Базовые концепции, домены
-
How to Use Store Named Attribute - YouTube
- Сводка: Практические примеры Store Named Attribute с real-world cases.
- Длительность: ~15 минут
- Уровень: Начинающий
-
Store Named Attribute Demystified - YouTube
- Сводка: Развенчание мифов, от Josh Gambrell (опытный пользователь).
- Длительность: ~22 минуты
- Уровень: Средний
- Важность: ВЫСОКАЯ
Для среднего уровня
-
Attributes Reference - Blender Manual
- Сводка: Полный справочник всех встроенных атрибутов.
- Формат: Справочная документация
- Рекомендация: Используйте как справочник
-
Fields Documentation - Blender Manual
- Сводка: Официальное объяснение полей с диаграммами.
- Формат: Документация
- Используйте: Для глубокого понимания
Специальные техники
-
Attribute transfer between geometries - YouTube
- Сводка: Использование Sample Index / Sample Nearest для передачи данных.
- Длительность: ~25 минут
- Уровень: Средний-Сложный
-
Domain conversion techniques - BlenderArtists
- Сводка: Как переводить атрибуты между доменами.
- Формат: Форумное обсуждение
- Полезность: Высокая
Распространённые проблемы и решения (УРОВЕНЬ 2.1)
Проблема 1: "Attributes не сохраняются"
Диагностика:
Store Named Attribute добавлена, но атрибут не видим в Shader Editor
Причина:
Зелёный провод "Geometry" не проходит ЧЕРЕЗ Store Named Attribute
Решение:
Group Input Geometry → Store Named Attribute → Group Output
НЕ НУЖНО:
Group Input Geometry ↓
Store Named Attribute (не используется!)
↓
Group Output
Диагностика: Используйте Spreadsheet Editor (Window → Toggle Sidebar → выберите Spreadsheet)
Проблема 2: "Capture Attribute захватывает неправильные значения"
Причина:
Не понимание когда field оценивается.
Концепция:
- Fields оцениваются КОГДА ИСПОЛЬЗУЮТСЯ, а не когда созданы
- Capture Attribute "замораживает" field В МОМЕНТ ПРОХОЖДЕНИЯ через ноду
Пример:
Position (это field! переоценится везде где используется)
↓
Set Position (измен позицию) ← Position field переоценится ЗА ЭТОЙ нодой!
↓
Capture Attribute ← слишком поздно, захватим новую позицию!
Правильно:
Position (оригинальная позиция)
↓
Capture Attribute (ЗАХВАТИЛИ оригинальную позицию)
↓
Set Position (изменили позицию)
↓
Named Attribute (читаем ОРИГИНАЛЬНУЮ позицию)
Проблема 3: "Named Attribute не видны в Shader Editor"
Проверочный список:
- Имя совпадает точно (case-sensitive!)
- Domain правильный (обычно Point/Vertex)
- Geometry проходит через Store Named Attribute
- Modifier применён (Preview mode или Apply)
- В Attribute node Shader Editor указано правильное имя
Решение пошагово:
Шаг 1: В GN создайте Store Named Attribute (name: "custom_color", domain: Point)
Шаг 2: Убедитесь что зелёный провод проходит через эту ноду
Шаг 3: В Shader Editor добавьте Attribute node (name: "custom_color", domain: Point)
Шаг 4: Подключите к Principled BSDF
Шаг 5: Если не работает, переключитесь в Preview или Apply modifier
Проблема 4: "Domain mismatch — данные на неправильном домене"
Сценарий:
Store на Face домене → Distribute Points (создаёт Point домен) → можно ли читать?
Ответ: НЕТ! Нужно преобразовать домен.
Решение: Использовать правильные ноды для преобразования:
| Из домена | В домен | Используйте |
|---|---|---|
| Point → Face | Interpolate Domain | |
| Face → Point | Store на исходной геометрии перед Distribute Points |
Лайфхаки от профессионалов
"Freeze" техника
Нужно сохранить ИСХОДНОЕ состояние перед деформацией:
Group Input Geometry
↓
Capture Attribute (name: "original_position", value: Position node)
↓ (сохранили оригинальную позицию)
[сложные операции - трансформации, деформации]
↓
Named Attribute ("original_position") → используем для сравнения/восстановления
Named conventions
Используйте префиксы для группировки атрибутов:
v_color = вершинный цвет (Point домен)
v_random = random значение на вершине
f_material = материал на лице (Face домен)
uv_main = главные UV (Corner домен)
sp_width = ширина сплайна (Spline домен)
Это сильно улучшает читаемость node tree'я!
Debug workflow
Быстрая визуализация атрибутов:
1. Store Named Attribute (name: "debug_value", domain: Point)
↓
2. В Shader Editor: Attribute → Color Ramp (для красивого отображения)
↓
3. Viewer Node с красивой визуализацией
Практический проект P2.1: "Параметрическая колоннада"
Сложность: Средний
Время: 2-3 часа
Используемые ноды: Distribute Points, Instance on Points, Store Named Attribute, Random Value
Описание:
Создание процедурной колоннады с разными типами столбов, которые размещаются вдоль кривой с полным контролем через параметры.
Что вы изучите:
- Использование Store Named Attribute для сохранения данных
- Параметризация сложной системы
- Работа с Collection для разных типов элементов
- Оптимизация через инстансы
МОДУЛЬ 2.2: MATH И VECTOR MATH — ПОЛНОЕ ПОГРУЖЕНИЕ
Концепция: Math — основа процедурности
Все процедурные системы строятся на математике:
Паттерны (повторение) → Modulo
Анимация (движение) → Sine, Cosine
Условия (выбор) → Compare, Switch
Плавность (blend) → Smoothstep, Clamp, Map Range
Расстояния (близость) → Distance, Length
Vector Math — Ключевые операции
Dot Product (A · B) — Скалярное произведение
Формула: \( A \cdot B = |A| \times |B| \times \cos(\theta) \)
Результат: Single number (скалар)
Для normalized vectors (длина = 1):
- = 1: Параллельны, одно направление (angle = 0°)
- = 0: Перпендикулярны (angle = 90°)
- = -1: Параллельны, противоположное направление (angle = 180°)
Применение:
- Углы между векторами
- Similarity check (насколько похожи направления)
- Lighting calculations (Normal · Light)
- ВАЖНО: Всегда Normalize перед Dot Product!
Пример (Lighting):
Normal node (направление поверхности)
↓ Normalize
Light Direction (from target)
↓ Normalize
Dot Product → результат от -1 до 1 (освещение)
Cross Product (A × B) — Векторное произведение
Результат: Вектор перпендикулярный обоим A и B
Направление: Right-hand rule (закрутить пальцы от A к B, большой палец = результат)
Важное: A×B = -(B×A) (порядок имеет значение!)
Применение:
- Создание perpendicular vector (ортогональные оси)
- Surface normals calculation
- Rotation axes
- Лайфхак: Normal × Tangent = Bitangent (complete coordinate frame)
Map Range — переопределение диапазона
Официальная документация: https://docs.blender.org/manual/en/latest/modeling/geometry_nodes/utilities/math/map_range.html
Назначение: Преобразовать значение из одного диапазона в другой
Входы:
- Value — входное значение
- From Min/Max — диапазон входа
- To Min/Max — диапазон выхода
- Clamp — ограничить ли результат выходным диапазоном
Формула:
\( \text{result} = \text{To Min} + (\text{value} - \text{From Min}) \times \frac{\text{To Max} - \text{To Min}}{\text{From Max} - \text{From Min}} \)
Пример (falloff с distance):
Distance to target: от 0 до 10 метров
Хотим: от 1.0 (близко) до 0.0 (далеко)
Map Range:
- From Min: 0
- From Max: 10
- To Min: 1.0
- To Max: 0.0
- Clamp: включить
Math Node — Все операции
Официальная документация: https://docs.blender.org/manual/en/latest/render/shader_nodes/converter/math.html
Trigonometric (тригонометрия)
Sine, Cosine, Tangent:
- Input в radians (не градусы!)
- \( \sin(0) = 0, \sin(\pi/2) = 1, \sin(\pi) = 0 \)
- \( \cos(0) = 1, \cos(\pi/2) = 0, \cos(\pi) = -1 \)
Conversion: Radians = Degrees × (π/180) ≈ Degrees × 0.0175
Применение:
- Циклическое движение (looping animation)
- Круговая траектория (combine sin/cos)
- Wave patterns
Пример (circular motion):
Time (в секундах)
↓ Math (Multiply by 2π)
↓ [Sine → умножить на Radius → X координата]
[Cosine → умножить на Radius → Y координата]
↓ Combine XYZ
↓ Set Position
Modulo (остаток от деления)
Формула: A mod B = остаток от A/B
Применение:
- Повторяющиеся паттерны (каждый N-й элемент)
- Quantization (округление к ближайшему increment)
- Циклические индексы
Пример (выбрать каждый 5-й элемент):
Index node
↓
Math (Modulo 5)
↓
Compare (== 0)
↓ Boolean selection
Smoothstep — гладкий переход
Формула: Гладкий переход от 0 к 1 между Edge0 и Edge1
Входы:
- Edge (может быть Edge0/Edge1) — граница перехода
- Value — значение для проверки
Результат:
- Ниже Edge0 = 0
- Между Edge0 и Edge1 = гладкое значение от 0 до 1
- Выше Edge1 = 1
Применение:
- Easing functions (плавное ускорение/замедление)
- Soft falloff (вместо резкого)
- Smooth LOD transitions
Практические примеры Math
Пример 1: Пульсирующее движение
Time node
↓
Math (Multiply by 2π × frequency)
↓
Math (Sine)
↓
Scale by amplitude
↓
Add к базовой позиции
Пример 2: Spiral параметры
Time / Period × 2π → angle
Distance from center (рассчитано) → radius
Z coordinate proportional to time → height
X = radius × Cos(angle)
Y = radius × Sin(angle)
Z = height
Лучшие туториалы (УРОВЕНЬ 2.2)
-
Vector Math Made Easy - CGCookie
- Сводка: Best introduction к Vector Math. Очень понятно.
- Длительность: Статья (~30 минут чтения)
- Уровень: Новичок
- ОБЯЗАТЕЛЬНО: Прочитайте перед началом Level 2
-
Vector math is EASY when you SEE it - YouTube
- Сводка: Визуализация концепций вектора. Очень хорошо для понимания.
- Длительность: ~20 минут
- Уровень: Новичок-Средний
-
- Сводка: Инженерный подход ко всем операциям Math node.
- Длительность: ~35 минут
- Уровень: Средний
- Изучите: Все основные операции
-
Trigonometric Animation - YouTube
- Сводка: Использование Sine/Cosine для анимации.
- Длительность: ~25 минут
- Уровень: Средний
-
Map Range Magic - BlenderArtists
- Сводка: Как правильно использовать Map Range для falloff.
- Формат: Форумное обсуждение
- Полезность: Высокая
МОДУЛЬ 2.3: RAYCAST И PROXIMITY — ВЗАИМОДЕЙСТВИЕ ГЕОМЕТРИЙ
Концепция: Две ноды для "видения" других объектов
Raycast — Отслеживание лучей
Документация: https://docs.blender.org/manual/en/latest/modeling/geometry_nodes/geometry/sample/raycast.html
Назначение: Отслеживать лучи от одной геометрии на другую (как лазер)
Входы:
- Target Geometry — геометрия на которую отслеживаем
- Ray Direction — направление луча
- Ray Length — максимальная длина луча
- Source Position — откуда начинается луч
Выходы:
- Hit Position — где луч попал
- Hit Distance — расстояние до попадания
- Hit Normal — нормаль в точке попадания
- Is Hit — был ли hit (Boolean)
Применение:
- Ground snapping (ray вниз на земля)
- Collision detection
- Line of sight checks
- Scanner effects
Лайфхак: Ray Direction обычно (0, 0, -1) для вниз
Proximity — Ближайшая точка на геометрии
Документация: https://docs.blender.org/manual/en/latest/modeling/geometry_nodes/geometry/sample/geometry_proximity.html
Назначение: Найти ближайшую точку на target геометрии
Входы:
- Target Geometry — где искать ближайшую точку
- Sample Position — от где ищем
Выходы:
- Position — ближайшая точка на target
- Distance — расстояние до неё
Применение:
- Attractor systems (объекты тянутся к целям)
- Falloff effects (эффект убывает с расстоянием)
- Deformation based on proximity
- Collection avoidance
Лайфхак: Combine с Map Range для плавного falloff
Лучшие туториалы (УРОВЕНЬ 2.3)
-
Raycast Node Explained - YouTube
- Сводка: Полное объяснение Raycast с примерами.
- Длительность: ~25 минут
- Уровень: Средний
- Изучите: Hit Position, Hit Distance, Hit Normal, Is Hit
-
- Сводка: Подробный разбор с визуализацией лучей.
- Длительность: ~25 минут
- Уровень: Средний
- Проекты: Ground snapping, Scanner effect
-
- Сводка: Attractor systems и falloff через Proximity.
- Длительность: ~20 минут
- Уровень: Средний
- Изучите: Combine с Map Range
-
Raycast vs Proximity - BlenderArtists
- Сводка: Когда использовать что.
- Формат: Форумное обсуждение
Практический проект P2.3: "Ground Snapping с Raycast"
Сложность: Средний
Время: 1.5-2 часа
Используемые ноды: Raycast, Set Position, Rotate Align to Vector
Описание:
Рассеивание объектов на ландшафт так, чтобы они следовали поверхности (как в real game).
Что вы изучите:
- Raycast для ground snapping
- Ориентирование по нормали поверхности
- Комбинирование нескольких техник
ФИНАЛЬНЫЙ ПРОЕКТ УРОВНЯ 2
🎬 ПРОЕКТ R.4: "Параметрический процедурный город"
Сложность: Advanced
Время: 8-12 часов
Навыки: Все из Level 2
Описание:
Полностью процедурный город с зданиями, улицами, вариациями, которым можно управлять через параметры.
Требования:
- Multiple типы зданий
- Случайные вариации (размер, цвет, детали)
- Улицы и планировка
- Параметры для контроля плотности, стиля, и т.д.
- Хорошо организованный node tree
- Оптимизирован через инстансы
Лучшие туториалы:
КОНТРОЛЬНЫЙ ЧЕК-ЛИСТ УРОВНЯ 2
Fields & Attributes
- Понимаю разницу между Field и Attribute
- Могу использовать Capture Attribute для сохранения позиции
- Могу использовать Store Named Attribute для экспорта в шейдеры
- Понимаю домены (Point, Edge, Face, Corner, Spline)
- Могу диагностировать проблемы с атрибутами через Spreadsheet
Math & Vector Math
- Знаю когда использовать Dot Product vs Cross Product
- Могу создать circular motion через Sine/Cosine
- Понимаю Modulo для повторяющихся паттернов
- Могу использовать Map Range для falloff
- Знаю что Input в Math Sine/Cosine в радиях, а не градусах
Raycast & Proximity
- Могу использовать Raycast для ground snapping
- Могу создать attractor system через Proximity
- Понимаю разницу между Raycast и Proximity
- Могу комбинировать их для сложных эффектов
Общее
- Могу создать параметрическую систему
- Могу организовать complex node tree
- Могу диагностировать и исправлять ошибки
- Готов к Level 3!
Навигация
Авторы
- Volumorph - @volumorph
- David "Dr. Strange" Ayrapetian - @david_ayrapetiann
- Maxim "Dr. Artist" Zhuravlev - @WhiteCatWeb
- Manachrome Factory - @Manachrome_Factory
- Artyom "Биполярыч" Sidorov - @artyomsidorov25
- Pepsied "Cola" - @pepsiedina